/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package edu.uoc.tfc.exuoc.controladors;

import edu.uoc.tfc.exuoc.config.Config;
import edu.uoc.tfc.exuoc.model.Grup;

import edu.uoc.tfc.exuoc.errors.BuitException;
import java.io.UnsupportedEncodingException;
import org.hibernate.HibernateException;
import java.util.Iterator;
import edu.uoc.tfc.exuoc.utils.Eines;
/**
 * Classe que gestionarà la persistència mitjançant la classe
 * GestorBDD (genèrica)
 *
 * @author emoreno
 */
public class grupsDAO {
    private GestorBDD gd=new GestorBDD();
    private GestorLogs  log=GestorLogs .getLogger(this.getClass().getName());

    protected grupsDAO(){
    }

    public void tancarConnexio() throws HibernateException{
        gd.close();
        gd=null;
    }

    /** S'afegeix aquest mètode per poder actualitzar la llista d'usuaris que 
     * pertanyen a un grup. De moment la gestió de nous grups o eliminacions no
     * es té en compte.
     * 
     * @param grup
     * @throws HibernateException
     * @throws BuitException
     * 
     */
    public void modificar(Grup grup) throws HibernateException, BuitException{
            try {
                //09/12/2011:Emili:gd.begin();
                gd.modificar(grup);
            }catch (HibernateException e){
                log.error("No s'ha pogut modificar el grup ({})  ",grup.getNom());
                throw e;
            }catch (BuitException e){
            log.error("No s'ha pogut modificar el grup ({})  ",grup.getClass().getCanonicalName());
            throw e;
        }finally{
                gd.close();
            }

    }

    public Grup consulta(Long id) throws HibernateException, BuitException {
        Grup grup=null;
        try{
           //08/12/2011:Emili: gd.begin();
            grup=(Grup)gd.llegir(Grup.class, id);
        }catch(HibernateException e){
            log.error("No s'ha pogut obtenir el grup :{}  ",String.valueOf(id));
            //throw e;

        }catch (BuitException e){
            log.error("No s'ha pogut obtenir el grup :{}  ",String.valueOf(id));
            throw e;
        }
        return grup;
    }

   public Grup consulta(String valor) throws HibernateException, BuitException, UnsupportedEncodingException {
        Grup grup=null;
        try{
            //08/12/2011:Emili:gd.begin();
            grup=(Grup)gd.llegir(Grup.class,"nom", valor);
        }catch(HibernateException e){
            log.error("No s'ha pogut obtenir el grup :{}  ",String.valueOf(valor));
            //throw e;

        }catch (BuitException e){
            log.error("No s'ha pogut obtenir el grup ({}. No existeix)  ",String.valueOf(valor));
            throw e;
        }catch (UnsupportedEncodingException e){
            log.error("No s'ha pogut obtenir el grup ({}).Error de paràmetres  ",String.valueOf(valor));
            throw e;
        }
        return grup;
    }
    
    public Iterator<Grup> llista()  throws HibernateException, BuitException{
        Iterator<Grup> llistat =null;
        try{
            //08/12/2011:Emili:gd.begin();
            llistat= (Iterator<Grup>) gd.Llista(Grup.class).iterator();
        }catch (BuitException e){
            log.error("No s'ha pogut obtenir el llistat de grups");
            throw e;
        }
        finally{
           // gd.close();
        }
        return llistat;
    }
    
    public Iterator<Grup> llista(int ini, int fi)  throws HibernateException, BuitException{
        Iterator llistat =null;
        try{
            //08/12/2011:Emili:gd.begin();
            llistat= (Iterator) gd.Llista(Grup.class, ini, fi, "id", Config.ORDRE).iterator();
        }catch (BuitException e){
            log.error("No s'ha pogut obtenir el llistat de grups");
            throw e;
        }
        finally{
           // gd.close();
        }
        return llistat;
    }

    public Iterator<Grup> llista(String ordre, int quants)  throws HibernateException, BuitException{
        Iterator<Grup> llistat =null;
        try{
            //08/12/2011:Emili:gd.begin();
            llistat= (Iterator<Grup>) gd.Llista(Grup.class,ordre,quants,"nom").iterator();
        }catch (BuitException e){
            log.error("No s'ha pogut obtenir el llistat de grups");
            throw e;
        }
        finally{
           // gd.close();
        }
        return llistat;
    }


    public int quants()throws HibernateException, BuitException{
         Integer quants=Config.valorNullInt;

        try {
           //08/12/2011:Emili: gd.begin();
            quants=gd.quants( Grup.class);
        }catch (HibernateException e){
            log.error("Error en la connexió amb la bdd. No s'ha pogut obtenir el nombre de grups.");

        }catch (BuitException e){
            log.error("No hi ha grups.");

        }
        return quants;
    }
    

    /*****************************************************************
     *
     * TEST
     *
     */
    private void testLlistat(grupsDAO uDao) {
         Iterator<Grup> it=null;
        try {
            it= uDao.llista("desc",7);
            Grup grup=null;
            Eines.escriu("Prova llistat Grups");
            Eines.escriu("=========================");
            while (it.hasNext()){
                grup=it.next();
                Eines.escriu("-"    +grup.toString());
            }
        }catch(HibernateException e){
            log.error("Error hibernate llistat");
        }catch(BuitException e){
            log.error("Error Buit llistat");
        }
       
        Eines.escriu();
    }
    private void testConsulta (grupsDAO uDao) {
        Grup grup=null;
        try {
            grup=uDao.consulta(1L);

            Eines.escriu("Prova consulta Grup");
            Eines.escriu("=========================");
        
            Eines.escriu("Usuari :"+grup.toString());
        }catch(HibernateException e){
            log.error("Error hibernate consulta");
        }catch(BuitException e){
            log.error("Error Buit consulta");
        }
        Eines.escriu();
    }
   
    private void testQuants(grupsDAO uDao){
        Eines.escriu("Prova quants Grups");
        Eines.escriu("========================");
        try {
            Eines.escriu(uDao.quants());
        } catch (HibernateException ex) {
            this.log.error("Error en la connexió a la bdd");
        } catch (BuitException ex) {
            this.log.error("No hi ha Grups");
        }
        Eines.escriu();
    }

    public static void main(String args[]) {
        grupsDAO uDao = new grupsDAO();
        uDao.testLlistat(uDao);
        //uDao.testConsulta(uDao);
        //uDao.testQuants(uDao);


        uDao.tancarConnexio();

    }
}
